﻿using System;
using System.Data;
using System.Windows.Forms;
using System.Data.Odbc;
using System.IO;
using System.Data.OleDb;
using System.Text;
using System.Collections.Generic;



namespace Mapa_de_Resultado
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            Abertura();
        }
         public void Abertura()
        {
            
            StreamReader sr;
            try
            {
                sr = File.OpenText(@"D:\js\endereco.txt");
               
                endereço  = sr.ReadLine();

                tbDiretorio.Text = endereço;
            }
            catch {
                endereço = @"C:\jamsoft\LABNEW\";
tbDiretorio.Text = endereço;                
                MessageBox.Show("NAO ENCONTROU O ARQUIVO DE ENDERECO", "Mensagem"); }
        }
        public static string endereço;
        public static string SelectedTable = string.Empty;

        private string  procuraPasta()
        {
            OpenFileDialog fdlg = new OpenFileDialog();
           
            fdlg.Title = "Selecione o arquivo";
            fdlg.InitialDirectory = @endereço;
            fdlg.FileName = txtNomeArquivo.Text;
            fdlg.Filter = "DBF Files(*.dbf)|*.dbf|All Files(*.*)|*.*";
            fdlg.FilterIndex = 1;
            fdlg.RestoreDirectory = true;
            if (fdlg.ShowDialog() == DialogResult.OK)
            {
                return fdlg.InitialDirectory;
            }
            else
            {
                return null;
            }
        }
        private void button_Click(object sender, EventArgs e)
        {
            info.Text = "Carregando... Por favor Aguarde";
            info.Visible = true;
            OpenFileDialog fdlg = new OpenFileDialog();
            fdlg.Title = "Selecione o arquivo";
            fdlg.InitialDirectory = @endereço;
            fdlg.FileName = txtNomeArquivo.Text;
            fdlg.Filter = "DBF Files(*.dbf)|*.dbf|All Files(*.*)|*.*";
            fdlg.FilterIndex = 1;
            fdlg.RestoreDirectory = true;
            if (fdlg.ShowDialog() == DialogResult.OK)
            {
                txtNomeArquivo.Text = fdlg.FileName;

                BtnLeDBFClick(sender, e);
                Application.DoEvents();
            }
            info.Visible = false;

        }

        void BtnLeDBFClick(object sender, EventArgs e)
        {
            OdbcConnection oConn = new OdbcConnection();


            oConn.ConnectionString = @"Driver={Microsoft dBase Driver (*.dbf)};SourceType=DBF;SourceDB="+endereço+";Exclusive=No;_Collate=Machine;NULL=NO;DELETED=NO;BACKGROUNDFETCH=NO;";
           // oConn.ConnectionString = strConnection;
            oConn.Open();
            OdbcCommand oCmd = oConn.CreateCommand();
            string query = "";
            if (condicional.TextLength > 0)
                query = condicional.Text;
            oCmd.CommandText = @query+" "+txtNomeArquivo.Text+" "+where.Text  ;
            DataTable dt = new DataTable();
            dt.Load(oCmd.ExecuteReader());
            oConn.Close();
            dgvItem.DataSource = dt;

        }
        private void Atualizar_Click(object sender, EventArgs e)
        {
            BtnLeDBFClick(sender, e);
            Application.DoEvents();
            condicional.Text = "select * from ";
            where.Text = "";

            BtnLeDBFClick(sender, e);
            Application.DoEvents();
        }
        public void createTable(string endereco, string tabela, string [] campos, DataTable info) {
            try
            {
                using (var dBaseConnection = new OleDbConnection(   @"Provider=Microsoft.Jet.OLEDB.4.0; " +
                                     @" Data Source="+endereco+"; " +   @"Extended Properties=dBase IV"))
                {
                    dBaseConnection.Open();
                 
                    string createTableSyntax =  " Create Table " + tabela+" (";
                    for (int i = 0; i < campos.Length; i++)
                    {
                        if (i != 0) createTableSyntax += " , ";
                        createTableSyntax += campos[i];
                    }
                    createTableSyntax += " );";

                    var cmd = new OleDbCommand(createTableSyntax, dBaseConnection);
                    cmd.ExecuteNonQuery();
                   
                    for (int j = 0; j < info.Rows.Count; j++)
                    {
                        string insertInto = "insert into " + tabela + " values (";
                    
                        for (int k = 0; k < campos.Length; k++ )
                        {                            
                            if (k != 0) insertInto += " , ";
                            insertInto += "'" + @info.Rows[j].ItemArray.GetValue(k).ToString().Replace('\'',' ') + "'";
                        }
                        insertInto += " )";
                        cmd = new OleDbCommand(insertInto, dBaseConnection);                        cmd.ExecuteNonQuery();
                    }
                }
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message);
            }
        
        }
        public void dropTable(string endereco, string tabela)
        {
            using (var dBaseConnection = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0; " +
                                    @" Data Source=" + endereco + "; " + @"Extended Properties=dBase IV"))
            {
                dBaseConnection.Open();
                try
                {
                    string drop = "drop table  " + tabela + ";";
                    var cmd2 = new OleDbCommand(drop, dBaseConnection);
                    cmd2.ExecuteNonQuery();
                }
                catch  { }
            }
        }
        private void planoA()
        {

          
            OdbcConnection oConn = new OdbcConnection();
            oConn.ConnectionString = @"Driver={Microsoft dBase Driver (*.dbf)};SourceType=DBF;SourceDB="+endereço+";Exclusive=No;_Collate=Machine;NULL=NO;DELETED=NO;BACKGROUNDFETCH=NO;";

            oConn.Open();

            OdbcCommand oCmd = oConn.CreateCommand();

            string testeH = "select a.req_ext,  b.codigo, b.nome, a.cod_req ,"
                           + "d.cod_exa, d.exame, e.cod_leg, e.descricao, e.sequenc as sequencia "
                + "from " + endereço + "REQUIS.BDF a , " + endereço + "CLI.BDF b , " + endereço + "REQEXA.DBF c, "
                + " " + endereço + "EXAME.BDF d , " + endereço + "LEGENDA.BDF e where "
                + "a.cod_cli = b.codigo and c.cod_req = a.cod_req and d.cod_exa = e.cod_exa and  c.cod_exa = e.cod_exa " + tWhere.Text;

            string[] testeJ = { "req_ext integer", "codigo integer", "nome char(50)","cod_req integer"  ,"cod_exa integer ", "exame char (50)", "cod_leg integer",
                    "descricao char(50)", "sequencia integer" };
            oCmd.CommandText = testeH;
            DataTable final2 = new DataTable();
            final2.Load(oCmd.ExecuteReader());
            dropTable(endereço, "Final2");
            createTable(endereço, "Final2", testeJ, final2);

            relatorio = final2;
            txtNomeArquivo.Text = endereço+"Final2.DBF";
            dgvItem.DataSource = final2;


            this.estrutura = criaEstrutura(final2);
            btCrystal.Visible = true;
            oConn.Close();

            return;

        }
        private void create_Click(object sender, EventArgs e)
        {
            try
            {
                //   planoA();
                //   return;
                //string where = "where c.cod_req >= " + tbDe.Text + " and c.cod_req <= "+ tbAte.Text;

                OdbcConnection oConn = new OdbcConnection();
                oConn.ConnectionString = @"Driver={Microsoft dBase Driver (*.dbf)};SourceType=DBF;SourceDB="+endereço+";Exclusive=No;_Collate=Machine;NULL=NO;DELETED=NO;BACKGROUNDFETCH=NO;";

                oConn.Open();

                OdbcCommand oCmd = oConn.CreateCommand();

                string qUm = "select c.req_ext, c.cod_req,d.codigo,d.nome"//,e.cod_exa, e.exame "
                    + " from " + endereço + "REQUIS.BDF c inner join " + endereço + "CLI.BDF d "
                    + "on (c.cod_cli = d.codigo) " + tWhere.Text;


                oCmd.CommandText = qUm;
                DataTable DUm = new DataTable("Um");
                DUm.Load(oCmd.ExecuteReader());
                string[] vetor = { "req_ext integer", "cod_req integer ", "codigo integer ", "nome char(100) " };
                createTable(endereço, "Uniao2", vetor, DUm);

                /////////////////////////// ACIMA OK
                string uniaoBase1 = "select d.cod_req , d.cod_exa,c.req_ext, c.codigo, c.nome "
                   + " from " + endereço + "REQEXA.DBF d inner join " + endereço + "Uniao2.BDF c " +
                   " on(d.cod_req=c.cod_req ) ";
                string[] vetor3 = { "cod_req integer ", "cod_exa integer", "req_ext integer", "codigo integer", "nome char(50)" };
                oCmd.CommandText = uniaoBase1;
                DataTable DAgrup = new DataTable();
                DAgrup.Load(oCmd.ExecuteReader());

                createTable(endereço, "veterana", vetor3, DAgrup);

                /////////////
                string qDois = "select c.cod_exa,c.exame,d.COD_LEG, d.DESCRICAO, d.sequenc as sequencia "
             + "from " + endereço + "EXAME.BDF c inner join " + endereço + "LEGENDA.BDF d " +
            "on (c.cod_exa = d.cod_exa) ";
                string[] vetor2 = { "cod_exa integer ", "exame char (50)", "cod_leg integer", "descricao char(50)", "sequencia integer" };
                oCmd.CommandText = qDois;
                DataTable DDois = new DataTable();
                DDois.Load(oCmd.ExecuteReader());
                createTable(endereço, "Uniao3", vetor2, DDois);
                //acima ok

                string ultima = "select b.req_ext, b.codigo, b.nome, b.cod_req, a.cod_exa, a.exame, a.cod_leg, a.descricao, a.sequencia"
                    + " from " + endereço + "Uniao3.BDF a inner join " + endereço + "VETERANA.BDF b on(a.cod_exa = b.cod_exa)"
                    + " order by b.cod_req, b.req_ext, b.codigo, a.cod_exa, a.cod_leg";
                string[] vUltima = 
                { "req_ext integer", "codigo integer", "nome char(50)","cod_req integer"  ,"cod_exa integer ", "exame char (50)", "cod_leg integer",
                    "descricao char(50)", "sequencia integer" };
                oCmd.CommandText = ultima;
                DataTable final = new DataTable();
                final.Load(oCmd.ExecuteReader());
                dropTable(endereço, "Final");
                createTable(endereço, "Final", vUltima, final);

                dropTable(endereço, "Uniao3");
                dropTable(endereço, "Uniao2");
                dropTable(endereço, "VETERANA");
                relatorio = final;
                txtNomeArquivo.Text = endereço;
                dgvItem.DataSource = final;


                this.estrutura = criaEstrutura(final);
                btCrystal.Visible = true;
                oConn.Close();
            }
            catch (Exception ee) { MessageBox.Show(ee.Message); }

        }
        public Estrutura criaEstrutura(DataTable dtt)
        {
            Estrutura estrutura = new Estrutura();
            int cont = 0;
            //(int cod_req, int req_ext, int cod_cliente, string nomeCliente, 
            //int cod_exame, string exame, int cod_leg, string descricao, int sequencia)
            while (dtt.Rows.Count > cont)
            {
                int cod_req = Convert.ToInt32(dtt.Rows[cont].ItemArray.GetValue(3));

                estrutura.addRequisicao(cod_req, Convert.ToInt32(dtt.Rows[cont].ItemArray.GetValue(0))
                    , Convert.ToInt32(dtt.Rows[cont].ItemArray.GetValue(1)), dtt.Rows[cont].ItemArray.GetValue(2).ToString()
                    , Convert.ToInt32(dtt.Rows[cont].ItemArray.GetValue(4)), dtt.Rows[cont].ItemArray.GetValue(5).ToString()
                    , Convert.ToInt32(dtt.Rows[cont].ItemArray.GetValue(6)), dtt.Rows[cont].ItemArray.GetValue(7).ToString()
                    , Convert.ToInt32(dtt.Rows[cont].ItemArray.GetValue(8)));

                cont++;
            }
            return estrutura;
  
            
        }
        public Estrutura estrutura;

        public DataTable relatorio;
        private void btCrystal_Click(object sender, EventArgs e)
        {
            //new Impressao(estrutura).ShowDialog();
            fmrImpressaoMatricial impressao = new fmrImpressaoMatricial(1050);

            impressao.SetDados(ajustaImpressao(estrutura.requisicao));
            impressao.ShowDialog();
        
        }

        public string ajustaImpressao(List<Requisicao> requisic)
        {
            int tamanhoLinha = 70;
            try
            {
                StringBuilder stcarta = new StringBuilder();
         
                #region
                foreach (Requisicao requis  in requisic)
                {
                    string linha = " ".PadRight(tamanhoLinha, ' ')+"\n"        ;

                    stcarta.Append(linha);
                    linha  = (("Requisição : "+requis.cod_req).PadRight(tamanhoLinha/2)
                        + (" | Requisição Externa : "+requis.req_ext).PadLeft(tamanhoLinha/2))+"\n";
                    stcarta.Append(linha);
                    stcarta.Append("     Cliente".PadRight(tamanhoLinha,' ')+"\n");
                    linha =       ("     Id :   "+ requis.cod_cliente+ " | Nome : "+requis.nomeCliente).PadRight(tamanhoLinha)+"\n";
                    stcarta.Append(linha);
                    stcarta.Append("-".PadRight(tamanhoLinha,'-')+"\n\n");

                    foreach (Exame exa in requis.exame)
                    {
                        linha  =  ("     Id :   " +exa.cod_exame+ " | Exame : "+exa.exame).PadRight(tamanhoLinha)+"\n\n";
                    stcarta.Append(linha);

                        foreach (Legenda leg in exa.legenda)
                        {
                            
                        linha  = (leg.sequencia.ToString("0000")+" - "+(leg.legenda.PadRight(30))+" :_")
                            .PadRight(tamanhoLinha,'_')+ "\n";
                    stcarta.Append(linha);

                        }
                        stcarta.Append("¨".PadRight(tamanhoLinha,'¨')+"\n");

                    }
                    stcarta.Append("_".PadRight(tamanhoLinha, '_') + "\n");
                }
                #endregion
                return stcarta.ToString();
            }
            catch (Exception ex)
            {
                System.Windows.Forms.MessageBox.Show("Erro na impressão!\n\n" + ex.Message, "J&S Solutions");
                return "";
            }

        }

        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                info.Text = "Carregando... Por favor Aguarde";
                info.Visible = true;
                string diretorio = @endereço; txtNomeArquivo.Text = diretorio;
                string where = "where c.cod_req >= " + tbDe.Text + " and c.cod_req <= "+ tbAte.Text;

                OdbcConnection oConn = new OdbcConnection();
                oConn.ConnectionString = @"Driver={Microsoft dBase Driver (*.dbf)};SourceType=DBF;SourceDB="+endereço+";Exclusive=No;_Collate=Machine;NULL=NO;DELETED=NO;BACKGROUNDFETCH=NO;";
                oConn.Open();
                
                OdbcCommand oCmd = oConn.CreateCommand();
                #region variaveis do metodo principal
                string qUm = "select c.req_ext, c.cod_req,d.codigo,d.nome"//,e.cod_exa, e.exame "
                    + " from " + endereço + "REQUIS.BDF c inner join " + endereço + "CLI.BDF d "
                    + "on (c.cod_cli = d.codigo) " + where;
                string uniaoBase1 = "select d.cod_req , d.cod_exa,c.req_ext, c.codigo, c.nome "
                  + " from " + endereço + "REQEXA.DBF d inner join " + endereço + "Uniao2.BDF c " +
                  " on(d.cod_req=c.cod_req ) ";
                string qDois = "select c.cod_exa,c.exame,d.COD_LEG, d.DESCRICAO, d.sequenc as sequencia "
                + "from " + endereço + "EXAME.BDF c inner join " + endereço + "LEGENDA.BDF d " +
                "on (c.cod_exa = d.cod_exa) ";
                string ultima = "select b.req_ext, b.codigo, b.nome, b.cod_req, a.cod_exa, a.exame, a.cod_leg, a.descricao, a.sequencia"
                    + " from " + endereço + "Uniao3.BDF a inner join " + endereço + "VETERANA.BDF b on(a.cod_exa = b.cod_exa)"
                    + " order by b.cod_req, b.req_ext, b.codigo, a.cod_exa, a.cod_leg";
               
                string[] vetor =   { "req_ext integer" , "cod_req integer ", "codigo integer ", "nome char(100) " };
                string[] vetor3 =  { "cod_req integer ", "cod_exa integer" , "req_ext integer", "codigo integer"    , "nome char(50)" };
                string[] vetor2 =  { "cod_exa integer ", "exame char (50)" , "cod_leg integer", "descricao char(50)", "sequencia integer" };
                string[] vUltima = { "req_ext integer" , "codigo integer"  , "nome char(50)"  ,"cod_req integer"    ,"cod_exa integer "
                                   , "exame char (50)" , "cod_leg integer" , "descricao char(50)", "sequencia integer" };
                int[] tamanho = {100,100,280,105,100,250,100,210,100};
                string []titulo = { "Req Externa","Id Cliente", "Nome", "Requerimento", "Id Exame", "Exame", "Id Legenda", "Legenda", "Sequencia" };
                DataTable DUm = new DataTable("Um");
                DataTable DAgrup = new DataTable();
                DataTable DDois = new DataTable();
                DataTable final = new DataTable();
                #endregion
                #region acao do metodo principal

                dropTable(diretorio, "Final");
                dropTable(diretorio, "Uniao3");
                dropTable(diretorio, "Uniao2");
                dropTable(diretorio, "VETERANA");
                
                oCmd.CommandText = qUm;               
                DUm.Load(oCmd.ExecuteReader());                
                createTable(diretorio, "Uniao2", vetor, DUm);

                oCmd.CommandText = uniaoBase1;               
                DAgrup.Load(oCmd.ExecuteReader());
                createTable(diretorio, "veterana", vetor3, DAgrup);
                
                oCmd.CommandText = qDois;                
                DDois.Load(oCmd.ExecuteReader());
                createTable(diretorio, "Uniao3", vetor2, DDois);
                
                oCmd.CommandText = ultima;
                final.Load(oCmd.ExecuteReader());      
                createTable(diretorio, "Final", vUltima, final);

                dropTable(diretorio, "Final");
                dropTable(diretorio, "Uniao3");
                dropTable(diretorio, "Uniao2");
                dropTable(diretorio, "VETERANA");
                #endregion
                relatorio = final;               
                dgvItem.DataSource = final;
                
                
                this.estrutura = criaEstrutura(final);
                btCrystal.Visible = true;
                oConn.Close();
                info.Visible = false;

            }
            catch (Exception ee) { MessageBox.Show(ee.Message); }


        }

       

    
        private void button2_Click(object sender, EventArgs e)
        {
            if (tbExt.Text.Length == 0 || tbRq.Text.Length == 0)
            {
                MessageBox.Show("Campos de Requerimento e Externo IMCOMPLETOS");

                info.Visible = false; return;
            }
            info.Visible = true;
            //string where = "where c.cod_req >= " + tbDe.Text + " and c.cod_req <= "+ tbAte.Text;

            OdbcConnection oConn = new OdbcConnection();
          
            oConn.ConnectionString = @"Driver={Microsoft dBase Driver (*.dbf)};SourceType=DBF;SourceDB="+endereço+";Exclusive=No;_Collate=Machine;NULL=NO;DELETED=NO;BACKGROUNDFETCH=NO;";

            oConn.Open();

            OdbcCommand oCmd = oConn.CreateCommand();
           string update = "update " + endereço + "REQUIS.DBF set  req_ext = "+tbExt.Text+" where cod_req = " + tbRq.Text;
            string qUm = "select cod_req as Requerimento,Req_ext as Requerimento_Externo,cod_cli as Cliente"//,e.cod_exa, e.exame "
                + " from "+endereço+"REQUIS.DBF where cod_req = "+ tbRq.Text;
            
            oCmd.CommandText = update;
            new DataTable().Load(oCmd.ExecuteReader());

            oCmd.CommandText = qUm;
            DataTable DUm = new DataTable();

            

            DUm.Load(oCmd.ExecuteReader());
            dgvItem.DataSource = DUm;
            oConn.Close();
            info.Visible = false;
        }

        private void button3_Click(object sender, EventArgs e)
        {
            endereço = tbDiretorio.Text;


        
        }
    }
}


